48. 创建序列和数据框

本章学习目标

  • 理解Pandas两种核心数据结构:SeriesDataFrame
  • 掌握多种创建 Series 的方法(列表、字典、数组)
  • 掌握多种创建 DataFrame 的方法(字典、数组、嵌套列表)
  • 学会设置 DataFrame 的行索引
  • 理解数据结构之间的相互转换

从NumPy到Pandas:为什么需要Pandas?

NumPy数组在数据分析中存在三个关键限制:

  • 缺乏标签:只能通过整数位置访问,无法使用股票代码、日期等标签
  • 数据类型单一:所有元素必须是相同类型
  • 缺失值处理:使用NaN表示缺失值,但处理不够灵活

Pandas通过 SeriesDataFrame 完美解决了这些问题。

Pandas两种核心数据结构对比

特性 Series DataFrame
维度 一维 二维
类比 带标签的数组 带标签的表格
索引 必须有索引 行索引 + 列名
金融应用 单只股票价格序列 多只股票多指标数据表

什么是Series?

Series是Pandas的 一维数据结构,可以理解为「带标签的数组」。

  • 索引(index):每个数据点的标签
  • 值(values):实际存储的数据
  • 名称(name):Series对象的标识(可选)
  • 数据类型(dtype):值的类型(int64、float64等)

创建Series:三种常用方法

Listing 1
import pandas as pd
import numpy as np

# 方法1:从Python列表创建
s1 = pd.Series([10, 20, 30, 40, 50])

# 方法2:从字典创建(键自动成为索引)
s2 = pd.Series({
    '贵州茅台': 1850,
    '五粮液': 220,
    '招商银行': 45
}, name='股价')

# 方法3:从NumPy数组创建
s3 = pd.Series(np.random.randn(5))

print('Series 1 (从列表创建):')
print(s1)
Series 1 (从列表创建):
0    10
1    20
2    30
3    40
4    50
dtype: int64

从字典创建Series的优势

Listing 2
import pandas as pd

s2 = pd.Series({
    '贵州茅台': 1850,
    '五粮液': 220,
    '招商银行': 45
}, name='股价')

print('Series 2 (从字典创建):')
print(s2)
print(f'索引: {s2.index.tolist()}')
Series 2 (从字典创建):
贵州茅台    1850
五粮液      220
招商银行      45
Name: 股价, dtype: int64
索引: ['贵州茅台', '五粮液', '招商银行']
  • 索引自动设置为字典的键,无需手动指定
  • 适合表示有标签的数据(如股票名称→价格的映射)

什么是DataFrame?

DataFrame是Pandas的 二维数据结构,类似于Excel表格。

  • 是金融分析中 最常用 的数据结构
  • 每一列可以是不同的数据类型
  • 有行索引和列名两种标签

从字典创建DataFrame

Listing 3
import pandas as pd

data = {
    '股票代码': ['600519.SH', '000858.SZ', '600036.SH'],
    '股票名称': ['贵州茅台', '五粮液', '招商银行'],
    '股价': [1850.0, 220.5, 45.2],
    '涨跌幅': [0.05, -0.02, 0.03]
}

df = pd.DataFrame(data)
print('DataFrame内容:')
print(df)
DataFrame内容:
        股票代码  股票名称      股价   涨跌幅
0  600519.SH  贵州茅台  1850.0  0.05
1  000858.SZ   五粮液   220.5 -0.02
2  600036.SH  招商银行    45.2  0.03

查看DataFrame的基本属性

Listing 4
import pandas as pd

data = {
    '股票代码': ['600519.SH', '000858.SZ', '600036.SH'],
    '股票名称': ['贵州茅台', '五粮液', '招商银行'],
    '股价': [1850.0, 220.5, 45.2],
    '涨跌幅': [0.05, -0.02, 0.03]
}
df = pd.DataFrame(data)

print(f'DataFrame形状: {df.shape}')
print(f'列名列表: {df.columns.tolist()}')
DataFrame形状: (3, 4)
列名列表: ['股票代码', '股票名称', '股价', '涨跌幅']
  • shape 返回 (行数, 列数)
  • columns 获取所有列名

从NumPy数组创建DataFrame

Listing 5
import numpy as np
import pandas as pd

arr = np.random.randn(5, 3)

df_random = pd.DataFrame(
    arr,
    columns=['特征1', '特征2', '特征3'],
    index=['样本1', '样本2', '样本3', '样本4', '样本5']
)

print('从NumPy数组创建的DataFrame:')
print(df_random)
从NumPy数组创建的DataFrame:
          特征1       特征2       特征3
样本1  1.369279 -0.989185 -0.067489
样本2  1.677549  0.261916  0.092575
样本3  1.863371 -0.487577 -0.575480
样本4  0.241499 -1.292895 -0.693391
样本5  0.375821 -1.242137 -2.128796
  • 适用于科学计算和金融建模产生的数据
  • 通过 columnsindex 参数添加有意义的标签

从嵌套列表创建DataFrame

Listing 6
import pandas as pd

data_list = [
    ['贵州茅台', 1850.0, 0.05],
    ['五粮液', 220.5, -0.02],
    ['招商银行', 45.2, 0.03]
]

df_from_list = pd.DataFrame(
    data_list,
    columns=['名称', '价格', '涨跌幅']
)

print('从列表的列表创建的DataFrame:')
print(df_from_list)
从列表的列表创建的DataFrame:
     名称      价格   涨跌幅
0  贵州茅台  1850.0  0.05
1   五粮液   220.5 -0.02
2  招商银行    45.2  0.03
  • 适用于从CSV或API获取的数据
  • 每个子列表对应一行数据

设置DataFrame的行索引

Listing 7
import pandas as pd

df = pd.DataFrame({
    '价格': [10, 20, 30, 40, 50],
    '销量': [100, 200, 150, 300, 250]
})

dates = pd.date_range('2024-01-01', periods=5)
df_indexed = df.set_index(dates)

print('带日期索引的DataFrame:')
print(df_indexed)
带日期索引的DataFrame:
            价格   销量
2024-01-01  10  100
2024-01-02  20  200
2024-01-03  30  150
2024-01-04  40  300
2024-01-05  50  250
  • pd.date_range() 生成日期序列
  • set_index() 将日期设置为行索引

使用日期索引的好处

设置日期索引后,可以更方便地进行时间序列操作:

  • df.loc['2024-01-01']:获取特定日期的数据
  • df.loc['2024-01-01':'2024-01-03']:获取日期范围内的数据
  • 支持按月、按季度等进行重采样聚合

比使用整数位置(iloc)更直观、更不容易出错。

本章小结

创建方式 适用场景
列表 → Series 简单一维数值数据
字典 → Series 有标签的键值对数据
字典 → DataFrame 列数据组织形式
数组 → DataFrame 科学计算/建模结果
嵌套列表 → DataFrame CSV/API获取的行数据

⭐ 平台任务解答代码

Listing 8
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import numpy as np
import pandas as pd  # 导入Pandas数据分析库

value_guotai = np.array([1.5284,1.4596,1.3745,1.4034,1.3935,1.39,1.412,1.4164]) #国泰金鑫股票基金2024年8月1日至8日净值数据的数组
date = np.array(["2024-08-01","2024-08-02","2024-08-05","2024-08-06","2024-08-07","2024-08-08","2024-08-09","2024-08-12"]) #交易日数组

series_guotai = pd.Series(data=value_guotai,index=date) #创建序列
print(type(series_guotai))  #查看变量的数据结构

data=[1.4596,1.001,0.897,2.051,1.7385];index=["国泰金鑫","中海医疗","华夏优势","富国城镇","上投摩根"] #创建8月2日基金净值的数组

value_0403 = pd.Series(data,index)  # 创建Series序列value_0403
print(type(value_0403))  # 输出数据类型


#任务二
import numpy as np
import pandas as pd  # 导入Pandas数据分析库

date = np.array(["2024-08-01","2024-08-02","2024-08-05","2024-08-06","2024-08-07","2024-08-08","2024-08-09","2024-08-12"]) #交易日数组

name = np.array(["国泰金鑫","中海医疗","华夏优势","富国城镇","上投摩根"])  #基金名称的数组并且用基金简称

data_3fund_array = np.array([[1.01,0.8918,2.038],[0.995,0.8833,2.025],[1.002,0.8735,2.032]]) #3只基金在2024年8月8日至12日净值的数组

data_3fund = pd.DataFrame(data=data_3fund_array,index=date[5:],columns=name[1:4]) #转成一个数据框

print(type(data_3fund))  # 输出数据类型

#任务三
import numpy as np
import pandas as pd  # 导入Pandas数据分析库

date = np.array(["2024-08-01","2024-08-02","2024-08-05","2024-08-06","2024-08-07","2024-08-08","2024-08-09","2024-08-12"]) #交易日数组

name = np.array(["国泰金鑫","中海医疗","华夏优势","富国城镇","上投摩根"])  # 创建NumPy数组name

# 创建NumPy数组value_total
value_total = np.array([[1.5284,0.991,0.9122,2.069,1.7742],[1.4596,1.001,0.897,2.051,1.7385],[1.3745,1,0.8786,2.023,1.6843],[1.4034,1.013,0.8944,2.027,1.6917],

[1.3935,1.007,0.8944,2.031,1.6957],[1.39,1.01,0.8918,2.038,1.6955],[1.412,0.995,0.8833,2.025,1.6938],[1.6938,1.002,0.8735,2.032,1.6899]]) #创建数组

data_total = pd.DataFrame(data=value_total,index=date,columns=name)  #转为数据框

print(data_total)  # 输出数据数据

#任务四
import numpy as np

import pandas as pd  # 导入Pandas数据分析库

value_guotai = np.array([1.5284,1.4596,1.3745,1.4034,1.3935,1.39,1.412,1.4164]) #国泰金鑫股票基金2024年8月1日至8日净值数据的数组

date = np.array(["2024-08-01","2024-08-02","2024-08-05","2024-08-06","2024-08-07","2024-08-08","2024-08-09","2024-08-12"]) #交易日数组

series_guotai = pd.Series(data=value_guotai,index=date)  # 创建Series序列series_guotai

data=[1.4596,1.001,0.897,2.051,1.7385];index=["国泰金鑫","中海医疗","华夏优势","富国城镇","上投摩根"] #创建8月2日基金净值的数组

value_0403 = pd.Series(data,index)  # 创建Series序列value_0403

name = np.array(["国泰金鑫","中海医疗","华夏优势","富国城镇","上投摩根"])  #基金名称的数组并且用基金简称

data_3fund_array =  np.array([[1.01,0.8918,2.038],[0.995,0.8833,2.025],[1.002,0.8735,2.032]])#3只基金在2024年8月8日至12日净值的数组

data_3fund = pd.DataFrame(data=data_3fund_array,index=date[5:],columns=name[1:4])  # 创建数据框data_3fund


list_guotai = list(series_guotai)#国泰金鑫8与1日到12日净值数据的序列转为列表

array_0403 = np.array(value_0403) #8月2日5只基金净值的序列转为数组

array_3fund = data_3fund.values  #8月8日到12日3只基金净值的数据框变为数组
print(array_3fund)  # 输出基金数据
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
              国泰金鑫   中海医疗    华夏优势   富国城镇    上投摩根
2024-08-01  1.5284  0.991  0.9122  2.069  1.7742
2024-08-02  1.4596  1.001  0.8970  2.051  1.7385
2024-08-05  1.3745  1.000  0.8786  2.023  1.6843
2024-08-06  1.4034  1.013  0.8944  2.027  1.6917
2024-08-07  1.3935  1.007  0.8944  2.031  1.6957
2024-08-08  1.3900  1.010  0.8918  2.038  1.6955
2024-08-09  1.4120  0.995  0.8833  2.025  1.6938
2024-08-12  1.6938  1.002  0.8735  2.032  1.6899
[[1.01   0.8918 2.038 ]
 [0.995  0.8833 2.025 ]
 [1.002  0.8735 2.032 ]]